package com.dingding.common.core.base.daox.impl;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.transform.Transformers;
import org.springframework.stereotype.Component;

import com.dingding.common.core.base.daox.ISQLBaseDao;
import com.dingding.common.core.util.ToolUtil;

/**
 * 
 * @ClassName: SQLBaseDaoImpl
 * @Description: 自定义SQL查询
 * @author CHEHAUNBO
 * @date 2016年8月22日 上午11:52:29
 * 
 */
@Component("SQLBaseDao")
public class SQLBaseDaoImpl extends BaseDaoXImpl implements ISQLBaseDao {

	/**
	 * 
	 * @Description:执行SQL并把结果转化成自定义的bean
	 * @param sql
	 *            执行的sql语句
	 * @param beanClass
	 *            接受结果bean的class
	 * @param params
	 *            查询参数
	 * @param T
	 *            查询到的数据bean
	 * @author CHEHUANBO
	 * @since 2.4.0
	 * 
	 */
	@Override
	public <T> T sqlToCustomBeanUnique(Class<T> beanClass, String sql, Object... params) {

		List<T> lists = this.listSqlToCustomBean(beanClass, sql, params);
		if (lists != null && lists.size() > 0) {
			return lists.get(0);
		}
		return null;
	}

	/**
	 * 
	 * @Description:执行SQL并把结果转化成自定义的bean
	 * @param sql
	 *            执行的sql语句
	 * @param beanClass
	 *            接受结果bean的class
	 * @param params
	 *            查询参数
	 * @param List<T>
	 *            查询到的数据集合
	 * @author CHEHUANBO
	 * @since 2.4.0
	 * 
	 */
	public <T> List<T> listSqlToCustomBean(Class<T> beanClass, String sql, Object... params) {
		return this.listSqlToCustomBean(beanClass, sql, -1, -1, params);
	}

	/**
	 * 
	 * @Description:执行SQL并把结果转化成自定义的bean
	 * @param sql
	 *            执行的sql语句
	 * @param currentPage
	 *            当前页
	 * @param pageSize
	 *            每页显示数量
	 * @param beanClass
	 *            接受结果bean的class
	 * @param params
	 *            查询参数
	 * @param List<T>
	 *            查询到的数据集合
	 * @author CHEHUANBO
	 * @since 2.4.0
	 * 
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> listSqlToCustomBean(Class<T> beanClass, String sql, int currentPage, int pageSize,
			Object... params) {

		Query sqlQuery = getSQLQuery(sql);

		// 设置SQL查询参数
		if (ToolUtil.isNotNullObj(params)) {
			setParameters(sqlQuery, params);
		}

		// 分页
		if (pageSize != -1 && currentPage != -1) {
			sqlQuery.setFirstResult((currentPage - 1) * pageSize); // 当前页
			sqlQuery.setMaxResults(pageSize); // 每页查询记录数

		}

		// 转换bean
		if (beanClass != null) {
			sqlQuery.setResultTransformer(Transformers.aliasToBean(beanClass));
		}

		try {
			return sqlQuery.list();
		} catch (Exception e) {
			log.error("根据用户自定义SQL查询数据出现异常！", e);
			return null;
		}

	}

	/**
	 * 
	 * @Description:执行SQL并把结果转化成自定义的bean
	 * @param sql
	 *            执行的sql语句
	 * @param currentPage
	 *            当前页
	 * @param pageSize
	 *            每页显示数量
	 * @param beanClass
	 *            接受结果bean的class
	 * @param params
	 *            查询参数
	 * @param List<T>
	 *            查询到的数据集合
	 * @author CHEHUANBO
	 * @since 2.4.0
	 * 
	 */
	@Override
	public <T> List<T> listSqlToCustomBeanByPage(Class<T> beanClass, String sql, int currentPage, int pageSize,
			Object... params) {
		return this.listSqlToCustomBean(beanClass, sql, currentPage, pageSize, params);
	}

	/**
	 * 
	 * @Description: 执行自定义SQL修改数据
	 * @param sql
	 *            sql 执行的sql语句
	 * @param parm
	 *            参数
	 * @return boolean true 成功 false 失败
	 * @author CHEHUANBO
	 * @version V2.6.2
	 * 
	 */
	public boolean updateSqLRow(String sql, Object... parm) {

		Query sqlQuery = getSQLQuery(sql);

		// 设置SQL查询参数
		if (ToolUtil.isNotNullObj(parm)) {
			setParameters(sqlQuery, parm);
		}

		int row = 0;
		try {
			row = sqlQuery.executeUpdate();
		} catch (Exception e) {
			log.error("执行自定义SQL修改数据出现异常！", e);
		}

		if (row > 0) {
			return true;
		}

		return false;

	}

}
